package br.ufal.ic.fracao.especialist.editor;

import br.ufal.ic.fracao.especialist.domain.Item;
import br.ufal.ic.fracao.especialist.domain.Rule;

public class Sintaxe {
	
    private Lexema lexema;    
    private boolean flagErro = true;    
    private Rule rule;    
    private Item item;    
    private String erro = new String();
    
    public Sintaxe(){
    	
    }
    
    public Sintaxe(final String _str) {
        lexema = new Lexema(_str);
        rule = new Rule();
        item = new Item();
    }
    
    public void programa() {
        
        analiseRule();
        
    }
    
    public void analiseRule() {
        lexema.analiseLexica();
        if (lexema.token.proxToken == lexema.token.palavra_reservada_rule) {
            lexema.analiseLexica();
            if (lexema.token.proxToken == lexema.token.parenteses_esquerdo) {
                lexema.analiseLexica();
                if (lexema.token.proxToken == lexema.token.parenteses_direito) {
                    if(!expressao()){
                        return;
                    }
                    if (lexema.token.proxToken == lexema.token.sinal_consequence) {
                        int aux;
                        aux = lexema.i;
                        lexema.analiseLexica();
                        if(lexema.token.proxToken == lexema.token.operator_equal){
                            System.out.println(lexema.s.substring(aux, lexema.i-1));
                            item.setDescription(lexema.s.substring(aux, lexema.i - 1).trim());
                            aux = lexema.i;
                            lexema.analiseLexica();
                            
                            if ((lexema.token.proxToken == lexema.token.codigo_final)) {
                                System.out.println(lexema.s.substring(aux, lexema.i - 1).trim());
                                
                                item.setValue(lexema.s.substring(aux, lexema.i - 1).trim());
                                
                                rule.setConclusion(item);
                                
                                item = new Item();
                            }else{
                                erro("faltou ponto e virgula");
                            }
                        } else{
                            erro("faltou sinal =");
                        }
                    } else {
                        erro("faltou sinal para a consequencia");
                    }
                    
                } else {
                    erro("faltou parenteses direito");
                }
            } else {
                erro("faltou parenteses esquerdo");
            }
        } else {
            erro("erro no rule");
        }
    }
    
    public boolean expressao() {
        int aux;
        do {
            aux = lexema.i;
            lexema.analiseLexica();
            if(lexema.token.proxToken == lexema.token.operator_equal){
                item.setDescription(lexema.s.substring(aux, lexema.i - 1).trim());
            }else{
                erro("faltou sinal =");
                return false;
            }
            aux = lexema.i;
            lexema.analiseLexica();
            if ((lexema.token.proxToken == lexema.token.operator_and)
            || (lexema.token.proxToken == lexema.token.sinal_consequence)){
                item.setValue(lexema.s.substring(aux, lexema.i - 2).trim());
                
                rule.addPremisse(item);
                
                item = new Item();
            }
        } while (lexema.token.proxToken == lexema.token.operator_and);
        
        return true;
    }
    
    public void erro(String _erro) {
        flagErro = false;
        erro = _erro;
        System.out.println(erro);
        
    }
    
    public Lexema getLexema() {
        return lexema;
    }
    
    public void setLexema(Lexema lexema) {
        this.lexema = lexema;
    }
    
    public Rule getRule() {
        return rule;
    }
    
    public void setRule(Rule rule) {
        this.rule = rule;
    }
    
    public String getErro() {
        return erro;
    }
    
    public void setErro(String erro) {
        this.erro = erro;
    }
    
    public boolean isFlagErro() {
        return flagErro;
    }
}
